A typical method of constructing an executable computer program includes compiling a plurality of source code files into machine-code object files. These object files are then linked together at build time to yield a tightly-coupled monolithic executable image. For complex applications, the executable can be quite large. Although monolithic executables operate efficiently, they have a number of drawbacks, including difficulty in programming, constructing, testing, and modifying the software.
Those drawbacks can be somewhat overcome by employing a modular architecture, where the software is divided into smaller, distinct modules that are linked together at run time. While such a modular architecture is more manageable than a monolithic structure, it executes less efficiently because it is less tightly integrated.